package study.itwill.team5.member;  
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar; 

import org.apache.log4j.Logger; 

import study.itwill.common.DBHandler;     
import study.itwill.common.Util;

public class Member {
	static Logger logger = Logger.getLogger(Member.class);

	private static final String TABLE = "member";
	
	/**
	 *회원 추가
	 *@param email     - 이메일
	 *@param nickname  - 별명
	 *@param user_pw   - 비밀번호
	 *@param user_name - 회원이름
	 *@param gender    - 성별
	 *@param birthday  - 생년월일
	 *@param hp        - 휴대폰번호
	 *@return     int  - 추가된 회원의 일련번호
	 */
	
	public int addMember(String email1,String email2, String nickname, String user_pw,
			String user_name, String gender, String birthday, String hp1,String hp2,String hp3) {
		
		logger.debug("=======method start >> addMember");
		logger.debug("[PARAMS] email1" + email1);
		logger.debug("[PARAMS] email2" + email2);
		logger.debug("[PARAMS] nickname" + nickname);
		logger.debug("[PARAMS] user_pw" + user_pw);
		logger.debug("[PARAMS] user_name" + user_name);
		logger.debug("[PARAMS] gender" + gender);
		logger.debug("[PARAMS] birthday" + birthday);
		logger.debug("[PARAMS] hp1" + hp1);
		logger.debug("[PARAMS] hp2" + hp2);
		logger.debug("[PARAMS] hp3" + hp3);

		int seq = -1;
		// SQL 인젝션 방어
				email1 = email1.replace("'", "\'");
				email2 = email2.replace("'", "\'");
				nickname = nickname.replace("'", "\'");
				user_pw = user_pw.replace("'", "\'");
				user_name = user_name.replace("'", "\'");
				gender = gender.replace("'", "\'");
				birthday = birthday.replace("'", "\'");
				hp1 = hp1.replace("'", "\'");
				hp2 = hp2.replace("'", "\'");
				hp3 = hp3.replace("'", "\'");
  
		DBHandler.beginTrans();
		
		String sql = "INSERT INTO member(email1,email2,nickname,"
				+ "user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date,edit_date) VALUES ('%s','%s','%s',password('%s'),'%s','%s','%s','%s','%s','%s','%s','%s')";
		

		boolean result = DBHandler.execSql(sql, email1,email2,nickname,user_pw,user_name,
				gender,birthday,hp1,hp2,hp3,Util.getTime(),Util.getTime());
		
		if (result) {			
			DBHandler.commit();
			seq = DBHandler.getMax(TABLE, "seq", null);
			logger.debug("처리결과 >> " + seq + "번 회원 등록 성공");
		} else {
			DBHandler.rollback();
			logger.error("처리결과 >> 데이터 추가 실패");
		}

		logger.debug("=============== method end >> addMember");

		return seq;
	}
	
	/**
	 *회원정보 수정
	 *@param email     - 이메일
	 *@param nickname  - 별명
	 *@param user_pw   - 비밀번호
	 *@param user_name - 회원이름
	 *@param gender    - 성별
	 *@param birthday  - 생년월일
	 *@param hp        - 휴대폰번호
	 *@return true     - 회원정보 수정 성공 / false - 회원정보 수정 실패
	 */
	
	public boolean editMember(int seq, String email1,String email2, String nickname, String user_pw,
			String user_name, String gender, String birthday, String hp1,String hp2,String hp3) {

		logger.debug("=======method start >> editMember");
		logger.debug("[PARAMS] seq" + seq);
		logger.debug("[PARAMS] email1" + email1);
		logger.debug("[PARAMS] email2" + email2);
		logger.debug("[PARAMS] nickname" + nickname);
		logger.debug("[PARAMS] user_pw" + user_pw);
		logger.debug("[PARAMS] user_name" + user_name);
		logger.debug("[PARAMS] gender" + gender);
		logger.debug("[PARAMS] birthday" + birthday);
		logger.debug("[PARAMS] hp1" + hp1);
		logger.debug("[PARAMS] hp2" + hp2);
		logger.debug("[PARAMS] hp3" + hp3);


		boolean result = false;

		DBHandler.beginTrans();

		String sql = "UPDATE member SET email1 = '%s',email2='%s', "
				+ "nickname = '%s', user_pw = '%s', user_name = '%s', gender = '%s', "
				+ "birthday = '%s' ,hp1 = '%s',hp2 = '%s',hp3 = '%s',edit_date ='%s' WHERE seq = %d;";

	 

		result = DBHandler.execSql(sql, email1, email2, nickname, user_pw,
				user_name, gender, birthday, hp1, hp2, hp3, Util.getTime(), seq);

		if (result) {
			DBHandler.commit();
			logger.debug("처리결과>>" + user_name + "회원님 정보 수정성공");
		} else {
			DBHandler.rollback();
			logger.error("처리결과 >> 정보 수정 실패 ");
		}

		logger.debug("=============== method end >> editMember");
		return result;
	}
	/**
	 * 회원삭제
	 * @param member_seq - 회원인련번호
	 * @return true      - 회원삭제 성공 / false - 회원삭제 실패
	 */
	
	public boolean deleteMember(int seq) {

		logger.debug("=============== method start >> deleteMember");
		logger.debug("[PARAMS] seq=" + seq);
		
		boolean result = false;
		
		DBHandler.beginTrans();
		
		String sql = "SELECT seq FROM board WHERE member_seq = %d;";
		ResultSet rs = DBHandler.getResult(sql, seq);
		ArrayList<Integer> list = null;
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<Integer>();
				while(rs.next()) {
					int list_seq = rs.getInt(1);
					list.add(list_seq);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		for (int i=0; i<list.size(); i++) {
			sql = "DELETE FROM comment WHERE board_seq = %d;";
			result = DBHandler.execSql(sql, list.get(i));
		}
		sql = "DELETE FROM board WHERE member_seq = %d;";
		result = DBHandler.execSql(sql, seq);
		sql = "DELETE FROM comment WHERE member_seq = %d;";
		result = DBHandler.execSql(sql, seq);
		sql = "DELETE FROM member_log WHERE member_seq = %d;";
		result = DBHandler.execSql(sql, seq);
		sql = "DELETE FROM wishlist WHERE member_seq = %d;";
		result = DBHandler.execSql(sql, seq);
		sql = "DELETE FROM member WHERE seq = %d;";
		result = DBHandler.execSql(sql, seq);
		
		if(result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 회원 계정 삭제 성공");
		} else {
			DBHandler.rollback();
			logger.error("처리결과 >> 데이터 삭제 실패 ");
		}
		
		logger.debug("=============== method end >> deleteMember");
		
		return result;
	}
	

	/**
	 * 회원검색
	 * @param member_seq - 회원일련번호
	 * @return           - MemberItem 일련번호로 한명의 회원만 검색
	 */
	
	public MemberItem viewMember(int seq) {
		MemberItem memberItem = null;

		logger.debug("========method start >> viewMember");
		logger.debug("[PARAMS] seq=" + seq);

		// 데이터 조회
		String sql = "SELECT seq,email1,email2,nickname,"
				+ "user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date,edit_date"
				+ " FROM member where seq=%d";
		ResultSet rs = DBHandler.getResult(sql, seq);

		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next(); 
				// 1) ResultSet의 모든 데이터를 변수로 추출 
				int seq1 = rs.getInt(1);
				String email1 = rs.getString(2);
				String email2 = rs.getString(3);
				String nickname = rs.getString(4);
				String user_pw = rs.getString(5);
				String user_name = rs.getString(6);
				String gender = rs.getString(7);
				String birthday = rs.getString(8);
				String hp1 = rs.getString(9);
				String hp2 = rs.getString(10);
				String hp3 = rs.getString(11);
				String reg_date = rs.getString(12);
				String edit_date = rs.getString(13);
				

				// 2) 추출한 값을 객체로 구성
				memberItem = new MemberItem(seq1,email1,email2, nickname, user_pw,
						user_name, gender, birthday, hp1,hp2,hp3,reg_date,edit_date);

			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}

		}
		if (memberItem == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공");
			logger.debug(memberItem.toString());
		}
		logger.debug("========method end >> viewMember");

		return memberItem;
	}

		// 회원 검색을 위한 파라미터 정의
	    // 0, null : 회원 전체리스트 검색
	    // 1, 이메일 검색
	    // 2, 닉네임 검색
	    // 3, 이름 검색
	    // 4, 성별 검색
	    // 5, 생년월일 검색
	    // 6, 핸드폰번호 검색
		/**
		 * 회원검색
		 * @param choice - 회원검색시 선택한 파라미터 번호
		 * @param search - 검색시 입력할 값
		 * @return       - 검색된 목록을 ArrayList 형태로 리턴
		 */
	public ArrayList<MemberItem> listMember(int choice, String search, int start, int end) {
		logger.debug("=============== method start >> listMember");
		logger.debug("[PARAMS] choice=" + choice);
		logger.debug("[PARAMS] search=" + search);
		
		ArrayList<MemberItem> list = null;
		
		String sql = null;
		
		switch (choice) {
		case 0:
			sql = "SELECT seq,email1,email2,nickname,user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date, edit_date  FROM member ORDER BY seq DESC LIMIT %d, %d ;";
			break;
		case 1:

			sql = "SELECT seq,email1,email2,nickname,user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date, edit_date  FROM member WHERE email LIKE '%%"
					+ search + "%%';";
			break;
		case 2:
			sql = "SELECT seq,email1,email2,nickname,user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date, edit_date  FROM member WHERE nickname LIKE '%%"
					+ search + "%%';";

			break;

		case 3:
			sql = "SELECT seq,email1,email2,nickname,user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date, edit_date   FROM member WHERE user_name LIKE '%%"
					+ search + "%%';";

			break;
		case 4:
			sql = "SELECT seq,email1,email2,nickname,user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date, edit_date  FROM member WHERE gender LIKE '%%"
					+ search + "%%';";

			break;
		case 5:
			sql = "SELECT seq,email1,email2,nickname,user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date, edit_date  FROM member WHERE birthday LIKE '%%"
					+ search + "%%';";

			break;
		case 6:
			sql = "SELECT seq,email1,email2,nickname,user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date, edit_date  FROM member WHERE hp LIKE '%%"
					+ search + "%%';";

			break;
		}

		ResultSet rs = DBHandler.getResult(sql, start, end);
		
		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<MemberItem>();

				while (rs.next()) {
					int seq = rs.getInt(1);
					String email1 = rs.getString(2);
					String email2 = rs.getString(3);
					String nickname = rs.getString(4);
					String user_pw = rs.getString(5);
					String user_name = rs.getString(6);
					String gender = rs.getString(7);
					String birthday = rs.getString(8);
					String hp1 = rs.getString(9);
					String hp2 = rs.getString(10);
					String hp3 = rs.getString(11);
					String reg_date = rs.getString(12);
					String edit_date = rs.getString(13);

					// 2) 추출한 값을 객체로 구성
					MemberItem item = new MemberItem(seq,email1,email2, nickname, user_pw,
							user_name, gender, birthday, hp1,hp2,hp3,reg_date, edit_date);

					
			
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}
		}
		logger.debug("====== method end >> listMember");

		return list;
	}
	
	public ArrayList<MemberItem> listMember(int choice, String search) {
		logger.debug("=============== method start >> listMember");
		logger.debug("[PARAMS] choice=" + choice);
		logger.debug("[PARAMS] search=" + search);
		
		ArrayList<MemberItem> list = null;
		
		String sql = null;
		
		switch (choice) {
		case 0:
			sql = "SELECT seq,email1,email2,nickname,user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date, edit_date  FROM member ORDER BY seq DESC;";
			break;
		case 1:

			sql = "SELECT seq,email1,email2,nickname,user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date, edit_date  FROM member WHERE email LIKE '%%"
					+ search + "%%';";
			break;
		case 2:
			sql = "SELECT seq,email1,email2,nickname,user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date, edit_date  FROM member WHERE nickname LIKE '%%"
					+ search + "%%';";

			break;

		case 3:
			sql = "SELECT seq,email1,email2,nickname,user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date, edit_date   FROM member WHERE user_name LIKE '%%"
					+ search + "%%';";

			break;
		case 4:
			sql = "SELECT seq,email1,email2,nickname,user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date, edit_date  FROM member WHERE gender LIKE '%%"
					+ search + "%%';";

			break;
		case 5:
			sql = "SELECT seq,email1,email2,nickname,user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date, edit_date  FROM member WHERE birthday LIKE '%%"
					+ search + "%%';";

			break;
		case 6:
			sql = "SELECT seq,email1,email2,nickname,user_pw,user_name,gender,birthday,hp1,hp2,hp3,reg_date, edit_date  FROM member WHERE hp LIKE '%%"
					+ search + "%%';";

			break;
		}

		ResultSet rs = DBHandler.getResult(sql);
		
		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<MemberItem>();

				while (rs.next()) {
					int seq = rs.getInt(1);
					String email1 = rs.getString(2);
					String email2 = rs.getString(3);
					String nickname = rs.getString(4);
					String user_pw = rs.getString(5);
					String user_name = rs.getString(6);
					String gender = rs.getString(7);
					String birthday = rs.getString(8);
					String hp1 = rs.getString(9);
					String hp2 = rs.getString(10);
					String hp3 = rs.getString(11);
					String reg_date = rs.getString(12);
					String edit_date = rs.getString(13);

					// 2) 추출한 값을 객체로 구성
					MemberItem item = new MemberItem(seq,email1,email2, nickname, user_pw,
							user_name, gender, birthday, hp1,hp2,hp3,reg_date, edit_date);

					
			
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}
		}
		logger.debug("====== method end >> listMember");

		return list;
	}

	/**
	 * listMember 회원검색시 search 값 = null일 때 전체검색을 위한 재정의
	 * @param i - null일 경우 값을 받는 파라미터
	 * @return  - 검색된 목록을 ArrayList 형태로 리턴
	 */
	public ArrayList<MemberItem> listMember(int i) {
		// TODO Auto-generated method stub
		logger.debug("=============== method start >> listMember(0)");
		logger.debug("====== method end >> listMember(0)");
		return listMember(i, null);
	}
	
	/**
	 * 회원 전체리스트 검색을 위한 오버로딩 정의
	 * @param choice					- 0으로 파라미터를 받을시 전체리스트 조회
	 * @param start - 검색 범위의 시작위치
	 * @param end - 한 페이지에 보여질 글의 목록 수
	 * @return ArrayList<MemberItem>	- 0과 null을 오버로딩된 메서드로 반환
	 */
	public ArrayList<MemberItem> listMember(int choice, int start, int end) {
		return listMember(choice, null, start, end);
	}
	
	/**
	 * 로그인
	 * @param email   - 이메일
	 * @param user_pw - 비밀번호
	 * @return   true - 로그인 성공 / false - 로그인 실패
	 */
	public boolean loginMember(String email1,String email2, String user_pw) {

		logger.debug("=============== method start >> loginMember");

		boolean result = false;
		DBHandler.beginTrans();

		String sql = "SELECT email1 FROM member WHERE email1 = '%s'AND email2='%s' AND user_pw='%s';";

		ResultSet rs = DBHandler.getResult(sql, email1,email2, user_pw);
		String email11 = null;
		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();

				// 1) ResultSet의 모든 데이터를 변수로 추출

				email11 = rs.getString(1);

			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			} 
		}
		if (email11 == null) {
			logger.error("로그인 실패");
		} else {
			logger.debug("로그인 성공");
			result = true;
		}
		logger.debug("========method end >> loginMember");
		return result;
	}
	/**
	 * 로그아웃
	 * @param member_seq - 회원일련번호
	 * @return      true - 로그아웃 성공 / false - 로그아웃 실패
	 */
	public boolean logoutMember(int member_seq) {
		boolean result = false;

		return result;
	}

}
